<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>操作符</title>
</head>
<body>
    <script>
        "use strict";
        /*
            ECMA-262描述了一组用于操作数据值的操作符，包括算术操作符（包括加号和减号）、位操作符、关系操作符和相等操作符等。
            ECMA-262操作符的与众不同之处在于，它们能够适用于很多值，例如字符串、数值、布尔值，甚至对象。不过，在应用于对象时，
            相应的操作符都会调用对象的valueOf()方法或toString()方法，以便取得可以操作的值。

            一元操作符：
                只能操作一个值的操作符叫做一元操作符。一元操作符是ECMAScript中最简单的操作符。

                1、递增和递减操作符 [++ --]
                    递增和递减操作符直接借鉴C，而且各有两个版本：前置型和后置型。顾名思义，前置型应该位于要操作的变量前面，
                    而后置型则应该位于要操作的变量之后。
                    
                    执行前置递增和递减操作时，变量的值都是在语句被求值之前改变的。
                    
                    后置型递增和递减操作符的语法不变，只不过要放在变量的后面，而不是前面，后置递增和递减与前置递增和递减有一个
                    非常重要的区别：即递增和递减操作是在包含他们的语句是在求值之后才执行的。

                    这4个操作符对任何值都适用，也就是他们不仅仅适用于整数，还可以用于字符串、布尔值、浮点值和对象。在应用于不同的值时，
                    递增和递减操作符遵循下列规则：
                        在应用于一个包含有效数字字符的字符串时，先将其转换为数字值，在执行加减1的操作。字符串变量变成数值变量
                        在应用于一个不包含有效数字字符的字符串时，将变量的值设置为NaN。字符串变量变成数值变量
                        在应用于布尔值false时，先将其转换为0再执行加减1的操作
                        在应用于布尔值true时，先将其转换为1再执行加减1的操作
                        在应用于浮点数值时，执行加减1的操作
                        在应用于对象时，先调用对象的valueOf()方法以取得一个可操作的值。然后对该值应用上述规则，如果结果是NaN，则再调用
                            toString()方法后再应用上述规则，对象变量最终变成数值变量。

                2、一元加和减操作符 [+ -]
                    绝大多数开发人员对一元加和减操作符都不会陌生，而且这两个ECMAScript操作符的作用与数学书上讲的完全一样。
                    
                    一元加操作符以一个加号(+)表示，放在数值前面，对数值不会产生任何影响。不过在对非数值应用一元加操作符时，
                    该操作符会像Number()转型函数一样对这个值执行转换。换句话说，布尔值false和true将会被转换成0和1，字符串值
                    会被按照一种特殊的规则解析，而对象是先调用valueOf()方法或toString()方法，在转换得到值。

                    一元减操作符主要用于表示负数。在将一元减操作符应用于数值时，该值会变成负数，二挡应用于非数值时，一元减操作符遵循
                    与一元加操作符相同的规则，最后再将得到的数值转换成负数。

            位操作符：
                位操作符作用域最基本的层次上，即按内存中表示数值的位来操作数值。ECMAScript中的所有数值都以IEEE-754 64位格式存储，但
                位操作符并不直接操作64位的值。而是现将64位的值转换为32位的整数，然后再执行操作，最后再将结果转换回64位。对于开发人员来说，
                64位存储格式是透明的，因此整个过程就像是操作32位整数一样。

                对于有符号的整数，32位中的前31位用于保存整数的值，第32位用于保存整数的符号：0表示正数，1表示负数。这个表示符号的位叫做符号位。
                符号位的值决定了其他位的格式。其中正数以纯二进制格式存储，31位中的每一位都是2的幂...

                负数同样以二进制码存储，但使用的格式是二进制补码。计算一个数值的二进制补码，需要经历下面3个步骤：
                    1、求这个数绝对值的二进制码
                    2、求二进制反码，即0变1,1变0
                    3、得到二进制的反码加1

                在以二进制字符串的形式输出一个负数时，我们看到的只是这个负数绝对值的二进制码前面加一个负号

                默认情况下，在ECMAScript中的所有整数都是有符号整数。

                在ECMAScript中，当对数值应用位操作符时，后台会发生如下转换过程:
                    64位的数值被转换成32位的数值，然后执行位操作，最后再将32位的结果转换回64位。
                    这样，表面上看起来像是在操作32位数值，就跟在其他语言中以类似方式执行二进制操作结果一样。
                    但这个转换过程也导致了一个严重的副效应，即在对特殊的NaN、Infinity值应用位操作时，这两个值都会被当做0来处理。
                
                如果对非数值应用位操作符，会先使用Number()函数将该值转换为一个数值（自动完成），然后在应用为操作，得到的结果将是一个数值。

                1、按位非 [~]
                    按位非操作符用一个波浪线表示(~)，执行按位非的结果就是返回数值的反码

                2、按位与 [&]
                    按位与操作符用一个和负号表示(&)，他有两个操作数。

                    第一个数值的位  第二个数值的位      结果
                        1               1              1
                        1               0              0
                        0               1              0
                        0               0              0

                    结论：按位与操作只有在两个数值对应的位都是1，才返回1，否则返回0

                3、按位或 [|]
                    按位或操作符由一个竖线符号(|)表示，同样也有两个操作数。

                    第一个数值的位  第二个数值的位      结果
                        1               1              1
                        1               0              1
                        0               1              1
                        0               0              0
                    
                    结论：按位或操作在有一个位是1的情况下返回1，而只有在两个位都是0的情况下才返回0

                4、按位异或 [^]
                    按位异或操作符是由一个插入符号(^)表示，也有两个操作数。

                    第一个数值的位  第二个数值的位      结果
                        1               1              0
                        1               0              1
                        0               1              1
                        0               0              0

                    结论：按位异或操作符在只有1个位是1的情况下才返回1，其他情况返回0

                5、左移 [<<]
                    左移操作符由两个小于号(<<)表示，这个操作符会将数值的所有位(符号位不变)向左移动指定的位数，右侧空出的位用0来填充
                    左移不会影响操作数的符号位

                6、有符号右移 [>>]
                    有符号右移以两个大于号(>>)表示，这个操作符会将数值享有移动指定的位数，保留符号位，在位移过程中产生的空位位于符号位的右侧
                    原数值的左侧，而此时ECMAScript会用符号位来填充所有空位。

                7、无符号右移 [>>>]
                    无符号右移操作符由3个大于号(>>>)表示，这个操作符会将数值的所有32位都向右移动，空出的位用0填充


        */
        

    </script>
</body>
</html>